
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>SpringCloudAlibaba - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>SpringCloudAlibaba - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">根据马丁·福勒的概述，微服务架构的核心思想是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">微服务架构是一种将单一应用程序划分为一组小服务的架构模式。每个服务都运行在自己的独立进程中，服务之间采用轻量级的通信机制（通常是基于HTTP的RESTful API）进行协调配合。这些服务围绕具体业务进行构建，可以被独立部署，并且可以使用不同的编程语言和数据存储技术。</div>
          </div>
          <div class="card-source">来源: 1、微服务架构思想</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">背景</div>
          <div class="card-question">为什么会诞生 Spring Cloud Alibaba？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">背景</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Cloud Alibaba 的诞生主要是因为 Spring Cloud Netflix 进入了维护阶段，不再推出新的组件。为了满足市场对技术更新的需求，阿里巴巴与 Spring 社区合作，结合了阿里的开源组件和阿里云商业化产品，为开发者提供了新的微服务解决方案，实现了双赢。</div>
          </div>
          <div class="card-source">来源: 2、SpringCloudAlibaba介绍 - 为什么会出现SpringCloudAlibaba</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Nacos 作为配置中心时，提供了哪三个维度的配置隔离？它们各自的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nacos 提供 Namespace、Group 和 Data ID 三个维度的配置隔离。Namespace 用于进行租户粒度的隔离，常用于区分开发、测试、生产等不同环境。Group 用于对配置集进行逻辑分组，可以将同一项目的不同模块配置隔离。Data ID 是配置集的唯一标识。</div>
          </div>
          <div class="card-source">来源: 6、Nacos配置中心 - Nacos配置中心其他参数</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Spring Cloud 应用中，如何实现 Nacos 配置的动态刷新？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">要实现 Nacos 配置的动态刷新，需要在需要刷新配置的 Spring 组件（例如 Controller 或 Service）的类上添加 `@RefreshScope` 注解。这样，当 Nacos 配置中心的内容发生变更时，应用无需重启即可获取到最新的配置值。</div>
          </div>
          <div class="card-source">来源: 6、Nacos配置中心 - Nacos配置动态刷新</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring Cloud Gateway 的三大核心组件是什么？它们分别扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Cloud Gateway 的三大核心组件是：<br>1.  `Route` (路由)：网关的基本单元，由ID、URI、一组Predicate和一组Filter组成。<br>2.  `Predicate` (断言)：路由转发的判断条件，只有当请求满足断言条件时，路由才会生效。<br>3.  `Filter` (过滤器)：在请求路由转发时执行的过滤逻辑，可用于修改请求和响应内容。</div>
          </div>
          <div class="card-source">来源: 8、服务网关-Gateway</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Nacos 集群采用了什么共识算法？该算法中的节点有哪三种角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nacos 集群采用 Raft 算法来实现选举和数据同步。在该算法中，节点有三种角色：Leader (负责接收客户端请求)、Candidate (用于选举Leader的候选角色) 和 Follower (负责响应来自Leader或Candidate的请求)。</div>
          </div>
          <div class="card-source">来源: 10、Nacos集群 - Nacos集群原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Nacos 中的服务实例分为临时实例和持久化实例，它们之间有何关键区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要区别在于服务端的处理方式。临时实例（ephemeral: true）依赖客户端心跳来保活，Nacos不会持久化存储，如果实例在规定时间内未发送心跳，则会被移除。持久化实例（ephemeral: false）会被Nacos持久化处理，当实例下线时，只会被标记为不健康状态，而不会被删除。</div>
          </div>
          <div class="card-source">来源: 10、Nacos集群 - Nacos集群原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">Nacos 默认使用什么数据库进行数据存储？在生产环境的集群部署中，为什么推荐将其更换为 MySQL？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Nacos 默认使用嵌入式数据库 Derby 进行数据存储。在集群部署中，如果每个节点都使用独立的嵌入式数据库，会导致数据存储不一致的问题。因此，推荐采用集中式存储（如 MySQL）来支持集群化部署，确保数据的一致性。</div>
          </div>
          <div class="card-source">来源: 7、Nacos持久化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Feign 提供了哪四种日志级别用于监控 HTTP 请求？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Feign 提供了四种日志级别：<br>1.  NONE: 默认级别，不显示任何日志。<br>2.  BASIC: 仅记录请求方法、URL、响应状态码和执行时间。<br>3.  HEADERS: 在 BASIC 基础上，额外记录请求和响应的头信息。<br>4.  FULL: 在 HEADERS 基础上，额外记录请求和响应的正文及元数据。</div>
          </div>
          <div class="card-source">来源: 5、Nacos服务发现 - Feign日志调用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">规则</div>
          <div class="card-question">Nacos 配置中心中，客户端拉取配置文件的 Data ID 命名规则是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">规则</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Data ID 的完整格式为：`${prefix}-${spring.profiles.active}.${file-extension}`。其中 `prefix` 默认为 `spring.application.name` 的值，`spring.profiles.active` 为当前环境，`file-extension` 为文件扩展名（如 yaml 或 properties）。</div>
          </div>
          <div class="card-source">来源: 6、Nacos配置中心 - Nacos配置中心其他参数</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在微服务链路追踪中，Spring Cloud Sleuth 和 Zipkin 各自扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring Cloud Sleuth 负责获取并记录整个服务调用链路的信息，为每个请求生成追踪ID。Zipkin 则提供了一个图形化界面，用于收集、存储和展示由 Sleuth 生成的链路信息，帮助开发者直观地分析服务调用情况和定位问题。</div>
          </div>
          <div class="card-source">来源: 9、服务日志 - 背景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Ribbon 默认的负载均衡策略是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Ribbon 默认的负载均衡策略是 `RoundRobinRule`，即轮询策略，它会按照顺序选择可用的服务实例。</div>
          </div>
          <div class="card-source">来源: 5、Nacos服务发现 - Ribbon负载均衡策略</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
